package top.someapp.dxf2dsvg.base;

/**
 * 目前只涉及二维的图形，但是autocad中的坐标都是x, y, z描述的三维空间中的点，在“点”的设计上就会有这么几种思路：<br>
 * 1. 单独的Point2D和Point3D，两者之间不存在任何关系(继承)
 * 2. Point2D extend Point3D, 二维的点是一种特殊的三维点(没有z轴)
 * 3. Point3D extend Point2D, 三维的点是一种特殊的二维点(增加了z轴)
 * 总结：只需设计一个类即可，在这个类中标识具体的实例是二维的还是三维的，因为z值的变化会导致实例的二维和三维概念发生变化，但是实际的类型(class)
 * 是不会发生变化的, 现实生活中的概念和编程世界中的概念是有差别的！！
 *
 * @author zwz
 * Created on 2020-04-19
 * @see <a href="https://www.zhihu.com/question/38633872">
 * 你会怎样设计长方形类和正方形类？</a>
 */
public class Point {
    float x;
    float y;
    float z;
//    public static final Point o = new Point();

    public Point() {
        this(0, 0);
    }

    public Point(float x, float y) {
        this(x, y, 0);
    }

    public Point(float x, float y, float z) {
        this.x = x;
        this.y = y;
        this.z = z;
    }

    public float getX() {
        return x;
    }

    public Point setX(float x) {
        this.x = x;
        return this;
    }

    public float getY() {
        return y;
    }

    public Point setY(float y) {
        this.y = y;
        return this;
    }


    public float getZ() {
        return z;
    }

    public Point setZ(float z) {
        this.z = z;
        return this;
    }

    public boolean isPoint2D() {
        return z == 0;
    }

    public boolean isPoint3D() {
        return z != 0;
    }

    @Override
    public String toString() {
        return "Point{" +
                "x=" + x +
                ", y=" + y +
                ", z=" + z +
                '}';
    }
}
